package br.fatec.model.dao;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;

import br.fatec.model.entity.Embalagem;
import br.fatec.util.Globals;
import br.fatec.util.Persistencia;
import br.fatec.util.Validacoes;

public class EmbalagemDao {
	
	private Persistencia persis;		
	
	public EmbalagemDao()
	{
		Globals globals = Globals.getInstance();
		
		this.persis = globals.getPersistencia();
	}
	
	public void cadastrar(Embalagem embalagem) throws Exception
	{	
		persis.cadastrar(embalagem);	
	}
	
	public void alterar(Embalagem embalagem) throws Exception
	{	
		persis.alterar(embalagem);
	}
	
	public void excluir(Embalagem embalagem) throws Exception
	{
		persis.excluir(embalagem.getClass(), embalagem.getCodigo());
	}
	
	
	public void desativar(Embalagem embalagem) throws Exception {
		embalagem = consultar(embalagem.getCodigo());
		
		embalagem.setAtivo(false);
		
		persis.alterar(embalagem);
	}
	
	public Embalagem consultar(Integer codigo) throws Exception
	{	
		String query = "select * from embalagem where codigo = :codigo and ativo = :ativo";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("codigo", codigo);
		parametros.put("ativo", true);
		
		return (Embalagem)persis.consultar(Embalagem.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<Embalagem> listar() throws Exception
	{
		String query = "select * from embalagem where ativo = :ativo order by codigo asc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("ativo", true);
		
		return (List<Embalagem>)persis.listar(Embalagem.class, query, parametros);
	}

	@SuppressWarnings("unchecked")
	public List<Embalagem> listar(String nome) throws Exception
	{
		String query = "select * from embalagem where nome ilike :nome and ativo = :ativo order by nome asc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("nome", "%"+nome+"%");
		parametros.put("ativo", true);
		
		return (List<Embalagem>)persis.listar(Embalagem.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<Embalagem> listar(Embalagem.Tipo tipo) throws Exception {
		String query = "select * from embalagem where ativo = :ativo and tipo = :tipo order by codigo asc";
		
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("tipo", tipo.ordinal());
		parametros.put("ativo", true);

		return (List<Embalagem>) persis.listar(Embalagem.class, query, parametros);
	}
	
	@SuppressWarnings("unchecked")
	public List<Embalagem> filtrar(String codigo, String nome, Embalagem.Tipo tipo, String capacidade, String valorUnitario) throws Exception {
		String query = "select * from embalagem";		
		query += " where embalagem.ativo = :ativo";

		HashMap<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("ativo", true);
		
		if (codigo != null && !codigo.isEmpty())
		{
			query += " and cast(embalagem.codigo as varchar(50)) ilike :codigo";
			parametros.put("codigo", "%"+codigo+"%");
		}

		if (nome != null && !nome.isEmpty())
		{
			query += " and embalagem.nome ilike :nome";
			parametros.put("nome", "%"+nome+"%");
		}
		
		if (tipo != null)
		{
			query += " and embalagem.tipo = :tipo";
			parametros.put("tipo", tipo.ordinal());
		}
		
		if (capacidade != null && !capacidade.isEmpty())
		{
			if(Validacoes.isNumeric(capacidade.replace(",", ".")))
			{
				capacidade = new DecimalFormat("0.0000").format(Double.parseDouble(capacidade.replace(",", ".")));
			}
			
			query += " and cast(embalagem.capacidade as varchar(50)) ilike :capacidade";
			parametros.put("capacidade", capacidade.replace(",", "."));
		}
		
		if (valorUnitario != null && !valorUnitario.isEmpty())
		{
			if(Validacoes.isNumeric(valorUnitario.replace(",", ".")))
			{
				valorUnitario = new DecimalFormat("0.00").format(Double.parseDouble(valorUnitario.replace(",", ".")));
			}
			
			query += " and cast(embalagem.valor_unitario as varchar(50)) ilike :valor_unitario";
			
			parametros.put("valor_unitario", valorUnitario.replace(",", "."));
		}
		
		query +=  " order by embalagem.codigo asc";
		
		return (List<Embalagem>) persis.listar(Embalagem.class, query, parametros);
	}
}
